package org.example.scoresystem_backen.service;

import org.example.scoresystem_backen.entity.Course;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.util.List;

/**
 * 课程服务接口
 */
public interface CourseService {
    
    /**
     * 创建课程
     * @param course 课程信息
     * @return 创建的课程
     */
    Course createCourse(Course course);
    
    /**
     * 更新课程信息
     * @param course 课程信息
     * @return 更新后的课程
     */
    Course updateCourse(Course course);
    
    /**
     * 删除课程
     * @param id 课程ID
     */
    void deleteCourse(Integer id);
    
    /**
     * 根据ID查找课程
     * @param id 课程ID
     * @return 课程信息
     */
    Course findById(Integer id);
    
    /**
     * 根据课程名称查找课程
     * @param name 课程名称
     * @return 课程信息
     */
    Course findByName(String name);
    
    /**
     * 根据课程代码查找课程
     * @param code 课程代码
     * @return 课程信息
     */
    Course findByCode(String code);
    
    /**
     * 获取所有课程
     * @return 课程列表
     */
    List<Course> findAll();
    
    /**
     * 分页查询课程
     * @param pageable 分页参数
     * @return 课程分页数据
     */
    Page<Course> findAll(Pageable pageable);
    
    /**
     * 检查课程名称是否存在
     * @param name 课程名称
     * @return 是否存在
     */
    boolean existsByName(String name);
    
    /**
     * 检查课程代码是否存在
     * @param code 课程代码
     * @return 是否存在
     */
    boolean existsByCode(String code);
    
    /**
     * 根据学分查找课程列表
     * @param credits 学分
     * @return 课程列表
     */
    List<Course> findByCredits(BigDecimal credits);
    
    /**
     * 根据学分范围查找课程列表
     * @param minCredits 最小学分
     * @param maxCredits 最大学分
     * @return 课程列表
     */
    List<Course> findByCreditsBetween(BigDecimal minCredits, BigDecimal maxCredits);
    
    /**
     * 根据课程名称模糊查询课程
     * @param name 课程名称关键字
     * @return 课程列表
     */
    List<Course> findByNameContaining(String name);
    
    /**
     * 根据课程代码模糊查询课程
     * @param code 课程代码关键字
     * @return 课程列表
     */
    List<Course> findByCodeContaining(String code);
    
    /**
     * 获取所有课程，按名称排序
     * @return 课程列表
     */
    List<Course> findAllOrderByName();

    // ========== 分页查询相关方法 ==========

    /**
     * 分页查询课程（支持搜索和筛选）
     * @param pageRequest 分页请求参数
     * @return 分页响应结果
     */
    org.example.scoresystem_backen.dto.PageResponse<Course> findCoursesWithPagination(org.example.scoresystem_backen.dto.PageRequest pageRequest);

    // ========== 增强的删除操作 ==========

    /**
     * 删除课程（级联删除相关成绩记录）
     * @param id 课程ID
     */
    void deleteCourseWithCascade(Integer id);

    /**
     * 获取课程选项列表（用于下拉选择）
     * @return 课程选项列表
     */
    List<org.example.scoresystem_backen.dto.CourseOptionDTO> getCourseOptions();
}
